home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
game
/
board
/
Chaos_src.lha
/
chaos
/
src
/
MainAmi.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-05
|
41KB
|
1,155 lines
/* Chaos: The Chess HAppening Organisation System V5.3
Copyright (C) 1993 Jochen Wiedmann
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$RCSfile: MainAmi.c,v $
$Revision: 3.4 $
$Date: 1994/11/19 19:32:01 $
This file contains the system dependent functions to initialize the
main window and other global stuff. Highly system dependent.
Computer: Amiga 1200 Compiler: Dice 2.07.54 (3.0)
Author: Jochen Wiedmann
Am Eisteich 9
72555 Metzingen
Tel. 07123 / 14881
Internet: jochen.wiedmann@zdv.uni-tuebingen.de
*/
#ifndef CHAOS_H
#include "chaos.h"
#endif
#ifdef AMIGA
#include <workbench/startup.h>
#include <libraries/gadtools.h>
#include <dos/dostags.h>
#include <proto/icon.h>
#endif /* AMIGA */
/*
CloseLibs() closes the libraries.
*/
#ifdef AMIGA
struct Library *MUIMasterBase = NULL;
struct Library *IFFParseBase = NULL;
#endif /* AMIGA */
void CloseLibs(void)
#ifdef AMIGA
{
if (MUIMasterBase != NULL)
{ CloseLibrary(MUIMasterBase);
}
if (IFFParseBase != NULL)
{ CloseLibrary(IFFParseBase);
}
}
#endif /* AMIGA */
/*
DoStartup() processes the arguments (either from workbench or from
CLI). Note, that this is called before InitMain(). ShowError() probably
doesn't do its job, if it's called.
*/
#ifdef AMIGA
int MakeIcons;
int NoWindow;
char IconName[TRNFILENAME_LEN+1] = "s/Chaos_Project";
char MenuName[TRNFILENAME_LEN+1] = "s/Chaos_Menu";
char ProgName[TRNFILENAME_LEN+1];
Object *MainMenu;
#endif /* AMIGA */
void DoStartup(int argc, char *argv[])
#ifdef AMIGA
{ struct
{ char *name;
long makeicons;
char *deficon;
char *menufile;
char *language;
long nowindow;
long *winnerpoints;
long *drawpoints;
} args;
void *key = NULL;
args.name = NULL;
args.makeicons = (argc == 0);
args.deficon = NULL;
args.menufile = NULL;
args.language = NULL;
args.nowindow = FALSE;
args.winnerpoints = NULL;
args.drawpoints = NULL;
if (argc == 0) /* Workbench-Programm */
{ struct WBStartup *WBenchMsg = (struct WBStartup *) argv;
struct WBArg *wbarg;
struct DiskObject *dobj;
char **toolarray;
char *ptr;
BPTR olddir;
int i;
AllowErrorMessage = FALSE;
for (i = 0, wbarg = WBenchMsg->sm_ArgList;
i < ((2 < WBenchMsg->sm_NumArgs) ? 2 : WBenchMsg->sm_NumArgs);
i++, wbarg++)
{ olddir = -1;
if (wbarg->wa_Lock && *wbarg->wa_Name != '\0')
{ olddir = CurrentDir(wbarg->wa_Lock);
}
if (*wbarg->wa_Name != '\0' &&
(dobj = GetDiskObject((STRPTR) wbarg->wa_Name)) != NULL)
{ toolarray = (char **) dobj->do_ToolTypes;
if ((ptr = (char *) FindToolType((STRPTR *) toolarray,
(STRPTR) "NOICONS"))
!= NULL)
{ args.makeicons = FALSE;
}
if ((ptr = (char *) FindToolType((STRPTR *) toolarray,
(STRPTR) "DEFICON"))
!= NULL)
{ args.deficon = GetStringMem(&key, ptr);
args.makeicons = TRUE;
}
if ((ptr = (char *) FindToolType((STRPTR *) toolarray,
(STRPTR) "MENUFILE"))
!= NULL)
{ args.deficon = GetStringMem(&key, ptr);
args.makeicons = TRUE;
}
if ((ptr = (char *) FindToolType((STRPTR *) toolarray,
(STRPTR) "LANGUAGE"))
!= NULL)
{ args.language = GetStringMem(&key, ptr);
}
if ((ptr = (char *) FindToolType((STRPTR *) toolarray,
(STRPTR) "WINNERPOINTS"))
!= NULL)
{ DefaultWinnerPoints = atol(ptr);
}
if ((ptr = (char *) FindToolType((STRPTR *) toolarray,
(STRPTR) "DRAWPOINTS"))
!= NULL)
{ DefaultDrawPoints = atol(ptr);
}
FreeDiskObject(dobj);
}
if (i == 0)
{ /* Get program's pathname
*/
if (!NameFromLock(wbarg->wa_Lock, (STRPTR) ProgName,
sizeof(ProgName)-strlen(wbarg->wa_Name)-1))
{ *ProgName = '\0';
}
AddPart((STRPTR) ProgName,
(STRPTR) wbarg->wa_Name, sizeof(ProgName));
}
else
{ /* Get filename to load
*/
char filename[TRNFILENAME_LEN+1];
if (NameFromLock(wbarg->wa_Lock, (STRPTR) filename,
sizeof(filename)-strlen(wbarg->wa_Name)-1))
{ AddPart((STRPTR) filename, (STRPTR) wbarg->wa_Name,
sizeof(filename));
args.name = GetStringMem(&key, filename);
}
}
if (olddir != -1)
{ CurrentDir(olddir);
}
}
}
else /* CLI program */
{ struct RDArgs *rdargs;
if ((rdargs = ReadArgs((STRPTR)
"FILE,MAKEICONS/S,DEFICON/K,MENUFILE/K,"
"LANGUAGE/K,NOWINDOW/S,WINNERPOINTS/K/N,"
"DRAWPOINTS/K/N",
(LONG *) &args, NULL))
== NULL)
{ PrintFault(IoErr(), NULL);
exit(10);
}
if (args.name)
{ args.name = GetStringMem(&key, args.name);
}
if (args.language)
{ args.language = GetStringMem(&key, args.language);
}
if (args.deficon)
{ args.deficon = GetStringMem(&key, args.deficon);
}
if (args.menufile)
{ args.menufile = GetStringMem(&key, args.menufile);
}
if (args.winnerpoints)
{ DefaultWinnerPoints = *args.winnerpoints;
}
if (args.drawpoints)
{ DefaultDrawPoints = *args.drawpoints;
}
FreeArgs(rdargs);
/* Pfadnamen des Programms bestimmen.
*/
if (!NameFromLock(((struct Process *) FindTask(NULL))->pr_HomeDir,
(STRPTR) ProgName,
sizeof(ProgName)-strlen(argv[0])-1))
{ *ProgName = '\0';
}
AddPart((STRPTR) ProgName, (STRPTR) argv[0], sizeof(ProgName));
}
MakeIcons = args.makeicons;
NoWindow = args.nowindow;
if (args.deficon != NULL)
{ MakeIcons = TRUE;
strcpy(IconName, args.deficon);
}
if (args.menufile != NULL)
{ strcpy(MenuName, args.menufile);
}
InitChaosCatalog((STRPTR) args.language);
if (args.name != NULL)
{ LoadTournament(args.name, NULL, NULL);
}
PutMemList(&key);
}
#endif /* AMIGA */
/*
This initializes the libraries.
*/
void OpenLibs(void)
#ifdef AMIGA
{ /* Not all of the above are really needed. Without iffparse.library
we read the preferences like we did in 1.3 and use the english
strings on 2.0. Without locale.library we use the english strings
on 2.1 and above.
*/
if ((MUIMasterBase = OpenLibrary((STRPTR) "muimaster.library", 8))
== NULL)
{ ShowError("Cannot open 'mui.library' V8 or higher!");
exit(10);
}
IFFParseBase = OpenLibrary((STRPTR) "iffparse.library", 37);
}
#endif /* AMIGA */
/*
The InitRandom() function initializes the random number generator.
*/
void InitRandom(void)
#ifdef AMIGA
{ int i;
struct DateStamp ds;
extern ULONG RangeSeed;
DateStamp(&ds);
RangeSeed = ds.ds_Days + ds.ds_Minute + ds.ds_Tick/2;
for (i = 0; i < ds.ds_Minute; i++)
{ RangeRand(ds.ds_Tick);
}
}
#endif /* AMIGA */
/*
TerminateWnd() closes the main window.
*/
#ifdef AMIGA
APTR App = NULL; /* Application object */
struct DiskObject *AppDiskObject = NULL; /* Icon in iconified state */
#endif /* AMIGA */
void TerminateMainWnd(void)
#ifdef AMIGA
{
if (App)
{ MUI_DisposeObject(App);
App = NULL;
}
if (AppDiskObject)
{ FreeDiskObject(AppDiskObject);
}
}
#endif /* AMIGA */
/*
The InitMainWnd() function brings up the main window. The program is
terminated, if an error occurs.
*/
#ifdef AMIGA
APTR MainWnd; /* Main window */
static APTR TrnFileGad; /* Tournament file name */
static APTR TrnNameGadOut; /* Tournament name (output) */
static APTR TrnModeGad; /* Tournament mode */
static APTR NumPlayersGad; /* Number of players */
static APTR NumRoundsGad; /* Number of rounds */
#define ID_MenuAction 1
#define ID_Project_New 1001
#define ID_Project_Load 1002
#define ID_Project_Save 1003
#define ID_Project_SaveAs 1004
#define ID_Project_About 1005
#define ID_Project_Quit 1006
#define ID_Players_Add 1007
#define ID_Players_Import 1008
#define ID_Players_Modify 1009
#define ID_Players_Delete 1010
#define ID_Round_Pairings 1011
#define ID_Round_Pairings_SwissPairing 1012
#define ID_Round_Pairings_RoundRobin 1013
#define ID_Round_Pairings_RoundRobinShift 1014
#define ID_Round_Results 1015
#define ID_Round_Results_Sub 1016
#define ID_Output_PlayerList 1017
#define ID_Output_PlayerList_Short 1018
#define ID_Output_PlayerList_Long 1019
#define ID_Output_Rankings 1020
#define ID_Output_Round 1021
#define ID_Output_Round_Sub 1022
#define ID_Output_Table 1023
#define ID_Output_Table_All 1024
#define ID_Output_Table_Seniors 1025
#define ID_Output_Table_Juniors 1026
#define ID_Output_Table_Women 1027
#define ID_Output_Table_JuniorsA 1028
#define ID_Output_Table_JuniorsB 1029
#define ID_Output_Table_JuniorsC 1030
#define ID_Output_Table_JuniorsD 1031
#define ID_Output_Table_JuniorsE 1032
#define ID_Output_TableProgress 1033
#define ID_Output_DWZReport 1034
#define ID_Output_CrossTable 1035
#define ID_Output_CrossTable_Ascii 1036
#define ID_Output_CrossTable_TeX 1037
#define ID_Output_PlayerCards 1038
#define ID_Output_PlayerCards_Ascii 1039
#define ID_Output_PlayerCards_TeX 1040
#define ID_Prefs_Scoring 1041
#define ID_Prefs_Scoring_Simple 1042
#define ID_Prefs_Scoring_Buchholz 1043
#define ID_Prefs_Scoring_ExtBuchholz 1044
#define ID_Prefs_Scoring_SonnebornBerger 1045
#define ID_Prefs_Device 1046
#define ID_Prefs_Device_Screen 1047
#define ID_Prefs_Device_PrinterDraft 1048
#define ID_Prefs_Device_PrinterLQ 1049
#define ID_Prefs_Device_File 1050
#define ID_Prefs_SetGames 1051
#define ID_Prefs_MakeIcons 1052
#endif /* Amiga */
void InitMainWnd(void)
#ifdef AMIGA
{ int open;
extern void MakeDisplay(void);
extern struct MUI_Command ARexxCommands[];
static struct NewMenu MainNewMenu[] = {
NM_TITLE, (STRPTR) _MSG_TOURNAMENT_MENU, NULL, 0, NULL, NULL,
NM_ITEM, (STRPTR) _MSG_TOURNAMENT_NEW_ITEM, NULL, 0, 0L, (APTR)ID_Project_New,
NM_ITEM, (STRPTR) _MSG_TOURNAMENT_LOAD_ITEM, (STRPTR) _KEY_PROJECT_LOAD, 0, 0L, (APTR)ID_Project_Load,
NM_ITEM, (STRPTR) _MSG_TOURNAMENT_SAVE_ITEM, (STRPTR) _KEY_PROJECT_SAVE, 0, 0L, (APTR)ID_Project_Save,
NM_ITEM, (STRPTR) _MSG_TOURNAMENT_SAVEAS_ITEM, (STRPTR) _KEY_PROJECT_SAVE_AS, 0, 0L, (APTR)ID_Project_SaveAs,
NM_ITEM, (STRPTR) _MSG_TOURNAMENT_ABOUT_ITEM, (STRPTR) _KEY_PROJECT_ABOUT, 0, 0L, (APTR)ID_Project_About,
NM_ITEM, (STRPTR) _MSG_TOURNAMENT_QUIT_ITEM, NULL, 0, 0L, (APTR)ID_Project_Quit,
NM_TITLE, (STRPTR) _MSG_PLAYER_MENU, NULL, 0, NULL, NULL,
NM_ITEM, (STRPTR) _MSG_PLAYER_ADD_ITEM, (STRPTR) _KEY_PLAYERS_NEW, 0, 0L, (APTR)ID_Players_Add,
NM_ITEM, (STRPTR) _MSG_PLAYER_IMPORT_ITEM, NULL, 0, 0L, (APTR)ID_Players_Import,
NM_ITEM, (STRPTR) _MSG_PLAYER_MODIFY_ITEM, (STRPTR) _KEY_PLAYERS_MODIFY, 0, 0L, (APTR)ID_Players_Modify,
NM_ITEM, (STRPTR) _MSG_PLAYER_DELETE_ITEM, NULL, 0, 0L, (APTR)ID_Players_Delete,
NM_TITLE, (STRPTR) _MSG_ROUND_MENU, NULL, 0, NULL, NULL,
NM_ITEM, (STRPTR) _MSG_ROUND_PAIRINGS_ITEM, NULL, 0, 0L, (APTR)ID_Round_Pairings,
NM_SUB, (STRPTR) _MSG_ROUND_PAIRINGS_SWISS_SUB, NULL, 0, 0L, (APTR)ID_Round_Pairings_SwissPairing,
NM_SUB, (STRPTR) _MSG_ROUND_PAIRINGS_RROBIN_SUB, NULL, 0, 0L, (APTR)ID_Round_Pairings_RoundRobin,
NM_SUB, (STRPTR) _MSG_ROUND_PAIRINGS_SLIDE_SUB, NULL, 0, 0L, (APTR)ID_Round_Pairings_RoundRobinShift,
NM_ITEM, (STRPTR) _MSG_ROUND_RESULTS_ITEM, NULL, 0, 0L, (APTR)ID_Round_Results,
NM_TITLE, (STRPTR) _MSG_OUTPUT_MENU, NULL, 0, NULL, NULL,
NM_ITEM, (STRPTR) _MSG_OUTPUT_PLAYERS_ITEM, NULL, 0, 0L, (APTR)ID_Output_PlayerList,
NM_SUB, (STRPTR) _MSG_OUTPUT_PLAYERS_SHORT_SUB, NULL, 0, 0L, (APTR)ID_Output_PlayerList_Short,
NM_SUB, (STRPTR) _MSG_OUTPUT_PLAYERS_LONG_SUB, NULL, 0, 0L, (APTR)ID_Output_PlayerList_Long,
NM_ITEM, (STRPTR) _MSG_OUTPUT_RANKINGS_ITEM, NULL, 0, 0L, (APTR)ID_Output_Rankings,
NM_ITEM, (STRPTR) _MSG_OUTPUT_ROUND_ITEM, NULL, 0, 0L, (APTR)ID_Output_Round,
NM_ITEM, (STRPTR) _MSG_OUTPUT_TABLE_ITEM, NULL, 0, 0L, (APTR)ID_Output_Table,
NM_SUB, (STRPTR) _MSG_OUTPUT_TABLE_ALL_SUB, NULL, 0, 0L, (APTR)ID_Output_Table_All,
NM_SUB, (STRPTR) _MSG_OUTPUT_TABLE_SENIORS_SUB, NULL, 0, 0L, (APTR)ID_Output_Table_Seniors,
NM_SUB, (STRPTR) _MSG_OUTPUT_TABLE_JUNIORS_SUB, NULL, 0, 0L, (APTR)ID_Output_Table_Juniors,
NM_SUB, (STRPTR) _MSG_OUTPUT_TABLE_WOMEN_SUB , NULL, 0, 0L, (APTR)ID_Output_Table_Women,
NM_SUB, (STRPTR) _MSG_OUTPUT_TABLE_JUNIORSA_SUB, NULL, 0, 0L, (APTR)ID_Output_Table_JuniorsA,
NM_SUB, (STRPTR) _MSG_OUTPUT_TABLE_JUNIORSB_SUB, NULL, 0, 0L, (APTR)ID_Output_Table_JuniorsB,
NM_SUB, (STRPTR) _MSG_OUTPUT_TABLE_JUNIORSC_SUB, NULL, 0, 0L, (APTR)ID_Output_Table_JuniorsC,
NM_SUB, (STRPTR) _MSG_OUTPUT_TABLE_JUNIORSD_SUB, NULL, 0, 0L, (APTR)ID_Output_Table_JuniorsD,
NM_SUB, (STRPTR) _MSG_OUTPUT_TABLE_JUNIORSE_SUB, NULL, 0, 0L, (APTR)ID_Output_Table_JuniorsE,
NM_ITEM, (STRPTR) _MSG_OUTPUT_PROGRESSTABLE_ITEM, NULL, 0, 0L, (APTR)ID_Output_TableProgress,
NM_ITEM, (STRPTR) _MSG_OUTPUT_DWZ_ITEM, NULL, 0, 0L, (APTR)ID_Output_DWZReport,
NM_ITEM, (STRPTR) _MSG_OUTPUT_CROSSTABLE_ITEM, NULL, 0, 0L, (APTR)ID_Output_CrossTable,
NM_SUB, (STRPTR) _MSG_OUTPUT_CROSSTABLE_ASC_SUB, NULL, 0, 0L, (APTR)ID_Output_CrossTable_Ascii,
NM_SUB, (STRPTR) _MSG_OUTPUT_CROSSTABLE_TEX_SUB, NULL, 0, 0L, (APTR)ID_Output_CrossTable_TeX,
NM_ITEM, (STRPTR) _MSG_OUTPUT_PLAYERCARDS_ITEM, NULL, 0, 0L, (APTR)ID_Output_PlayerCards,
NM_SUB, (STRPTR) _MSG_OUTPUT_PLAYERCARDS_ASC_SUB, NULL, 0, 0L, (APTR)ID_Output_PlayerCards_Ascii,
NM_SUB, (STRPTR) _MSG_OUTPUT_PLAYERCARDS_TEX_SUB, NULL, 0, 0L, (APTR)ID_Output_PlayerCards_TeX,
NM_TITLE, (STRPTR) _MSG_PREFS_MENU, NULL, 0, NULL, NULL,
NM_ITEM, (STRPTR) _MSG_PREFS_TMODE_ITEM, NULL, 0, 0L, (APTR)ID_Prefs_Scoring,
NM_SUB, (STRPTR) _MSG_PREFS_TMODE_SIMPLE_SUB, NULL, CHECKIT|CHECKED, 14L, (APTR)ID_Prefs_Scoring_Simple,
NM_SUB, (STRPTR) _MSG_PREFS_TMODE_BUCHHOLZ_SUB, NULL, CHECKIT, 13L, (APTR)ID_Prefs_Scoring_Buchholz,
NM_SUB, (STRPTR) _MSG_PREFS_TMODE_EXTBCHHLZ_SUB, NULL, CHECKIT, 11L, (APTR)ID_Prefs_Scoring_ExtBuchholz,
NM_SUB, (STRPTR) _MSG_PREFS_TMODE_SONNEBORN_SUB, NULL, CHECKIT, 7L, (APTR)ID_Prefs_Scoring_SonnebornBerger,
NM_ITEM, (STRPTR) _MSG_PREFS_OUT_ITEM, NULL, 0, 0L, (APTR)ID_Prefs_Device,
NM_SUB, (STRPTR) _MSG_PREFS_OUT_SCREEN_SUB, NULL, CHECKIT|CHECKED, 14L, (APTR)ID_Prefs_Device_Screen,
NM_SUB, (STRPTR) _MSG_PREFS_OUT_PRTDRAFT_SUB, NULL, CHECKIT, 13L, (APTR)ID_Prefs_Device_PrinterDraft,
NM_SUB, (STRPTR) _MSG_PREFS_OUT_PRTLQ_SUB, NULL, CHECKIT, 11L, (APTR)ID_Prefs_Device_PrinterLQ,
NM_SUB, (STRPTR) _MSG_PREFS_OUT_FILE_SUB, NULL, CHECKIT, 7L, (APTR)ID_Prefs_Device_File,
NM_ITEM, (STRPTR) _MSG_PREFS_SETGAMES, NULL, CHECKIT|MENUTOGGLE, 0L, (APTR)ID_Prefs_SetGames,
NM_ITEM, (STRPTR) _MSG_PREFS_MAKEICONS_ITEM, NULL, CHECKIT|MENUTOGGLE, 0L, (APTR)ID_Prefs_MakeIcons,
NM_END, NULL, NULL, 0, 0L, NULL,
/*
32 empty entries are following here. The 'special' menu will be
probably put in here.
*/
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL,
NM_END, NULL, NULL, 0, 0L, NULL
};
/*
Localize the menu
*/
{ struct NewMenu *nm;
for(nm = MainNewMenu; nm->nm_Type != NM_END; nm++)
{ if (nm->nm_Label && nm->nm_Label != NM_BARLABEL)
{ nm->nm_Label = ((struct FC_String *) nm->nm_Label)->msg;
}
if (nm->nm_CommKey)
{ nm->nm_CommKey = ((struct FC_String *) nm->nm_CommKey)->msg;
}
}
}
/*
Reading the menu file.
*/
{ FILE *fh;
if ((fh = fopen(MenuName, "r")) != NULL ||
(fh = fopen("s:Chaos_Menu", "r")) != NULL)
{ int size;
char *menufile;
fseek(fh, 0, SEEK_END);
size = ftell(fh);
if ((menufile = malloc(size+1)) == NULL)
{ ShowError("Cannot read menufile, ignoring.");
}
else
{ fseek(fh, 0, SEEK_SET);
if (fread(menufile, size, 1, fh) != 1)
{ ShowError("Cannot read menufile, ignoring.");
}
else
{ int NumLines = 0;
struct NewMenu *nm = MainNewMenu;
/*
Look, where to put in the special menu.
*/
while (nm->nm_Type != NM_END)
{ nm++;
}
/*
Creating the menu header
*/
nm->nm_Type = NM_TITLE;
nm->nm_Label = MSG_SPECIAL_MENU;
/*
Scanning the menu file
*/
menufile[size] = '\0';
while(*menufile != 0 && NumLines < 31)
{ ++nm;
++NumLines;
nm->nm_Type = NM_ITEM;
nm->nm_Label = (STRPTR) menufile;
while(*menufile != '\n' && *menufile != '\0')
{ ++menufile;
}
if (*menufile != '\0')
{ *menufile = '\0';
nm->nm_UserData = (APTR) ++menufile;
while(*menufile != '\n' && *menufile != '\0')
{ ++menufile;
}
if (*menufile != '\0')
{ *(menufile++) = '\0';
}
}
}
}
}
fclose(fh);
}
}
/*
Get the programs icon to show it in iconified state.
*/
AppDiskObject = GetDiskObject((STRPTR) ProgName);
/*
Creating the GUI
*/
App = ApplicationObject,
MUIA_Application_Title, "Chaos",
MUIA_Application_Version, VERVERSION,
MUIA_Application_Copyright, "© 1993, Jochen Wiedmann",
MUIA_Application_Author, "Jochen Wiedmann",
MUIA_Application_Description, "The Chess HAppening Organisation System",
MUIA_Application_Base, "CHAOS",
MUIA_Application_Commands, ARexxCommands,
AppDiskObject ? MUIA_Application_DiskObject : TAG_IGNORE,
AppDiskObject,
SubWindow, MainWnd = WindowObject,
MUIA_Window_ID, MAKE_ID('M','A','I','N'),
MUIA_Window_Title, AVERSION,
MUIA_Window_Menustrip, MainMenu = MUI_MakeObject(MUIO_MenustripNM, MainNewMenu, 0),
WindowContents, VGroup,
Child, TextObject,
GroupFrame,
MUIA_Background, MUII_FILLBACK2,
MUIA_Text_Contents, "\033cC h a o s\n"
"\033cThe Chess HAppening Organisation System\n"
"Copyright © 1993, Jochen Wiedmann",
End,
Child, ColGroup(2),
Child, Label2(MSG_TOURNAMENT_FILE_OUTPUT),
Child, TrnFileGad = TextObject,
End,
Child, Label2(MSG_TOURNAMENT_NAME_OUTPUT),
Child, TrnNameGadOut = TextObject,
End,
Child, Label2(MSG_TOURNAMENT_MODE_OUTPUT),
Child, TrnModeGad = TextObject,
End,
End,
Child, HGroup,
Child, Label2(MSG_NUM_PLAYERS_OUTPUT),
Child, NumPlayersGad = TextObject,
End,
Child, HSpace(0),
Child, Label2(MSG_NUM_ROUNDS_OUTPUT),
Child, NumRoundsGad = TextObject,
Child, HSpace(0),
End,
End,
End,
End,
End;
/*
Successfull?
*/
if (App == NULL)
{ ShowError(MSG_MEMORY_ERROR);
exit(10);
}
/*
Setting up the notification events for the main window
*/
DoMethod(MainWnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, App, 2,
MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
DoMethod(App, MUIM_Notify, MUIA_Application_MenuAction, MUIV_EveryTime,
App, 2, MUIM_Application_ReturnID, ID_MenuAction);
/*
Opening the main window and checking for success
*/
if (!NoWindow)
{ set (MainWnd, MUIA_Window_Open, TRUE);
MakeDisplay();
get (MainWnd, MUIA_Window_Open, &open);
if (!open)
{ MUIError((char *) ERRMSG_CANNOT_OPEN_WINDOW);
TerminateMainWnd();
}
}
}
#endif /* AMIGA */
/*
The ShowError() function should bring up a requester telling an error.
*/
void ShowError(char *msg, ...)
#ifdef AMIGA
{
if (App)
{ MUI_RequestA(App, MainWnd, 0, (char *) MSG_ERROR_REQUEST,
(char *) MSG_OK, msg, (&msg)+1);
}
else if (IntuitionBase)
{ struct EasyStruct es;
es.es_StructSize = sizeof(es);
es.es_Flags = 0;
es.es_Title = MSG_ERROR_REQUEST;
es.es_TextFormat = (STRPTR) msg;
es.es_GadgetFormat = MSG_OK;
EasyRequestArgs(NULL, &es, NULL, (&msg)+1);
}
else if (AllowErrorMessage)
{ printf("%s\n", msg);
}
}
#endif /* AMIGA */
#ifdef AMIGA
/*
The following function gets called, if an MUI command fails.
*/
void MUIError(char *msg)
{ char *errmsg;
switch (MUI_Error())
{ case MUIE_OK:
errmsg = (char *) MUIERR_OK;
break;
case MUIE_OutOfMemory:
errmsg = (char *) MUIERR_OutOfMemory;
break;
case MUIE_OutOfGfxMemory:
errmsg = (char *) MUIERR_OutOfGfxMemory;
break;
case MUIE_InvalidWindowObject:
errmsg = (char *) MUIERR_InvalidWindowObject;
break;
case MUIE_MissingLibrary:
errmsg = (char *) MUIERR_MissingLibrary;
break;
case MUIE_NoARexx:
errmsg = (char *) MUIERR_NoARexx;
break;
case MUIE_SingleTask:
errmsg = (char *) MUIERR_SingleTask;
break;
default:
errmsg = (char *) MUIERR_Unknown;
}
ShowError(msg, errmsg);
}
#endif /* AMIGA */
/*
MemError() gets called, when memory is missing.
*/
void MemError(void)
{ ShowError((char *) MSG_MEMORY_ERROR);
}
/*
MakeDisplay() refreshs the information gadgets, enables or disables the
menuitems and looks for the menu preferences.
*/
void MakeDisplay(void)
#ifdef AMIGA
{ char numrounds[10], numplayers[10];
Object *menuObj;
/*
Information gadgets
*/
set(TrnFileGad, MUIA_Text_Contents, TrnFileName);
set (TrnNameGadOut, MUIA_Text_Contents, TrnName);
switch (TrnMode &
(TNMODEF_SWISS_PAIRING|TNMODEF_ROUND_ROBIN|TNMODEF_SHIFT_SYSTEM))
{ case 0:
set(TrnModeGad, MUIA_Text_Contents, NULL);
break;
case TNMODEF_SWISS_PAIRING:
set(TrnModeGad, MUIA_Text_Contents, MSG_SWISS_PAIRING);
break;
case TNMODEF_ROUND_ROBIN:
set(TrnModeGad, MUIA_Text_Contents, MSG_RUNDENTURNIER);
break;
default:
set(TrnModeGad, MUIA_Text_Contents, MSG_RUTSCHSYSTEM);
break;
}
sprintf(numrounds, "%d", NumRounds);
set(NumRoundsGad, MUIA_Text_Contents, numrounds);
sprintf(numplayers, "%d", NumPlayers);
set(NumPlayersGad, MUIA_Text_Contents, numplayers);
/*
Enabling and disabling menu items
*/
#define SetMenu(id, flag) \
if ((menuObj = (Object *) DoMethod(MainMenu, MUIM_FindUData, (id)))) \
{ set(menuObj, MUIA_Menuitem_Enabled, (flag)); \
}
SetMenu(ID_Players_Add,
!((RoundRobinTournament && NumRounds > 0) ||
(SwissPairingTournament && NumRounds > 1)));
SetMenu(ID_Players_Import,
!((RoundRobinTournament && NumRounds > 0) ||
(SwissPairingTournament && NumRounds > 1)));
SetMenu(ID_Players_Modify, NumPlayers > 0);
SetMenu(ID_Players_Delete,
(NumRounds == 0 && NumPlayers > 0) || SwissPairingTournament);
SetMenu(ID_Round_Pairings,
(NumRounds == 0 && NumPlayers > 0) || SwissPairingTournament);
SetMenu(ID_Round_Pairings_SwissPairing,
(NumRounds == 0 && NumPlayers > 0) ||
(SwissPairingTournament && NumGamesMissing == 0));
SetMenu(ID_Round_Pairings_RoundRobin, NumRounds == 0 && NumPlayers > 0);
SetMenu(ID_Round_Pairings_RoundRobinShift,
NumRounds == 0 && NumPlayers > 0);
SetMenu(ID_Round_Results, NumRounds > 0);
SetMenu(ID_Output_PlayerList, NumPlayers > 0);
SetMenu(ID_Output_Rankings, NumPlayers > 0);
SetMenu(ID_Output_Round, NumRounds > 0);
SetMenu(ID_Output_Table, NumRounds > 0);
SetMenu(ID_Output_TableProgress, SwissPairingTournament);
SetMenu(ID_Output_CrossTable, RoundRobinTournament);
SetMenu(ID_Output_PlayerCards,
(NumPlayers > 0 && NumRounds == 0) || SwissPairingTournament);
SetMenu(ID_Output_DWZReport, NumRounds > 0);
SetMenu(ID_Prefs_Scoring, NumRounds > 0);
SetMenu(ID_Prefs_Scoring_Buchholz, SwissPairingTournament);
SetMenu(ID_Prefs_Scoring_ExtBuchholz, SwissPairingTournament);
SetMenu(ID_Prefs_Scoring_SonnebornBerger, RoundRobinTournament);
/*
Finally let the items of the preferences menu reflect the current
settings
*/
#define SetMenuCheck(id, flag) \
if ((menuObj = (Object *) DoMethod(MainMenu, MUIM_FindUData, (id)))) \
{ set(menuObj, MUIA_Menuitem_Checked, (flag)); \
}
switch(TrnMode & TNMODE_TABMASK)
{ case 0:
SetMenuCheck(ID_Prefs_Scoring_Simple, TRUE);
SetMenuCheck(ID_Prefs_Scoring_Buchholz, FALSE);
SetMenuCheck(ID_Prefs_Scoring_ExtBuchholz, FALSE);
SetMenuCheck(ID_Prefs_Scoring_SonnebornBerger, FALSE);
break;
case TNMODEF_BUCHHOLZ:
SetMenuCheck(ID_Prefs_Scoring_Simple, FALSE);
SetMenuCheck(ID_Prefs_Scoring_Buchholz, TRUE);
SetMenuCheck(ID_Prefs_Scoring_ExtBuchholz, FALSE);
SetMenuCheck(ID_Prefs_Scoring_SonnebornBerger, FALSE);
break;
case TNMODEF_EXT_BUCHHOLZ:
SetMenuCheck(ID_Prefs_Scoring_Simple, FALSE);
SetMenuCheck(ID_Prefs_Scoring_Buchholz, FALSE);
SetMenuCheck(ID_Prefs_Scoring_ExtBuchholz, TRUE);
SetMenuCheck(ID_Prefs_Scoring_SonnebornBerger, FALSE);
break;
case TNMODEF_SONNEBORN_BERGER:
SetMenuCheck(ID_Prefs_Scoring_Simple, FALSE);
SetMenuCheck(ID_Prefs_Scoring_Buchholz, FALSE);
SetMenuCheck(ID_Prefs_Scoring_ExtBuchholz, FALSE);
SetMenuCheck(ID_Prefs_Scoring_SonnebornBerger, TRUE);
break;
}
switch (OutputDevice)
{ case DEVICE_Screen:
SetMenuCheck(ID_Prefs_Device_Screen, TRUE);
SetMenuCheck(ID_Prefs_Device_PrinterDraft, FALSE);
SetMenuCheck(ID_Prefs_Device_PrinterLQ, FALSE);
SetMenuCheck(ID_Prefs_Device_File, FALSE);
break;
case DEVICE_PrinterDraft:
SetMenuCheck(ID_Prefs_Device_Screen, FALSE);
SetMenuCheck(ID_Prefs_Device_PrinterDraft, TRUE);
SetMenuCheck(ID_Prefs_Device_PrinterLQ, FALSE);
SetMenuCheck(ID_Prefs_Device_File, FALSE);
break;
case DEVICE_PrinterLQ:
SetMenuCheck(ID_Prefs_Device_Screen, FALSE);
SetMenuCheck(ID_Prefs_Device_PrinterDraft, FALSE);
SetMenuCheck(ID_Prefs_Device_PrinterLQ, TRUE);
SetMenuCheck(ID_Prefs_Device_File, FALSE);
break;
case DEVICE_FileAscii:
SetMenuCheck(ID_Prefs_Device_Screen, FALSE);
SetMenuCheck(ID_Prefs_Device_PrinterDraft, FALSE);
SetMenuCheck(ID_Prefs_Device_PrinterLQ, FALSE);
SetMenuCheck(ID_Prefs_Device_File, TRUE);
break;
}
SetMenuCheck(ID_Prefs_MakeIcons, MakeIcons);
}
#endif /* AMIGA */
/*
ProcessMainWnd() waits for user actions like selecting a menu or
messages from the ARexx-port and processes them in an endless loop.
*/
int EnableARexx = TRUE;
static int GamesToBeSet = FALSE;
void ProcessMainWnd(void)
#ifdef AMIGA
{ ULONG Signal, open, ID;
APTR UserData;
int round, initMenu;
for (;;)
{ /*
Disable the menus, so the window is sleeping for our purposes.
*/
set (MainWnd, MUIA_Window_NoMenus, TRUE);
/*
Check for user actions
*/
ID = DoMethod(App, MUIM_Application_Input, &Signal);
EnableARexx = FALSE;
initMenu = FALSE;
switch(ID)
{ case MUIV_Application_ReturnID_Quit:
if (TestSaved())
{ exit(0);
}
break;
case ID_MenuAction:
get(App, MUIA_Application_MenuAction, &UserData);
switch((ULONG) UserData)
{ case ID_Project_Quit:
if (TestSaved())
{ exit(0);
}
break;
case ID_Project_New:
if (TestSaved())
{ NewTournament();
initMenu = TRUE;
}
break;
case ID_Project_Load:
if (TestSaved())
{ LoadTournament(NULL, NULL, NULL);
initMenu = TRUE;
}
break;
case ID_Project_Save:
SaveTournament(TrnFileName);
break;
case ID_Project_SaveAs:
SaveTournament(NULL);
initMenu = TRUE;
break;
case ID_Project_About:
About();
break;
case ID_Players_Add:
AddPlayers();
initMenu = TRUE;
break;
case ID_Players_Import:
ImportPlayers();
initMenu = TRUE;
break;
case ID_Players_Modify:
ModifyPlayers();
initMenu = TRUE;
break;
case ID_Players_Delete:
DeletePlayers();
initMenu = TRUE;
break;
case ID_Round_Pairings_SwissPairing:
DoPairings(TNMODEF_SWISS_PAIRING, TRUE, GamesToBeSet);
initMenu = TRUE;
break;
case ID_Round_Pairings_RoundRobin:
DoPairings(TNMODEF_ROUND_ROBIN, TRUE, FALSE);
initMenu = TRUE;
break;
case ID_Round_Pairings_RoundRobinShift:
DoPairings(TNMODEF_ROUND_ROBIN | TNMODEF_SHIFT_SYSTEM, TRUE, FALSE);
initMenu = TRUE;
break;
case ID_Round_Results:
if ((round = GetRoundNr()) != 0)
{ EnterResults(round);
initMenu = TRUE;
}
break;
case ID_Output_PlayerList_Short:
OutPlayerList(NULL, OutputDevice, FALSE);
break;
case ID_Output_PlayerList_Long:
OutPlayerList(NULL, OutputDevice, TRUE);
break;
case ID_Output_Rankings:
OutInternalRankings(NULL, OutputDevice);
break;
case ID_Output_Round:
if ((round = GetRoundNr()) != 0)
{ OutRound(NULL, OutputDevice, round);
}
break;
case ID_Output_Table_All:
OutTable(NULL, OutputDevice, 0, TrnMode);
break;
case ID_Output_Table_Seniors:
OutTable(NULL, OutputDevice, TNFLAGSF_SENIOR, TrnMode);
break;
case ID_Output_Table_Juniors:
OutTable(NULL, OutputDevice, TNFLAGSF_JUNIOR, TrnMode);
break;
case ID_Output_Table_Women:
OutTable(NULL, OutputDevice, TNFLAGSF_WOMAN, TrnMode);
break;
case ID_Output_Table_JuniorsA:
OutTable(NULL, OutputDevice, TNFLAGSF_JUNIORA, TrnMode);
break;
case ID_Output_Table_JuniorsB:
OutTable(NULL, OutputDevice, TNFLAGSF_JUNIORB, TrnMode);
break;
case ID_Output_Table_JuniorsC:
OutTable(NULL, OutputDevice, TNFLAGSF_JUNIORC, TrnMode);
break;
case ID_Output_Table_JuniorsD:
OutTable(NULL, OutputDevice, TNFLAGSF_JUNIORD, TrnMode);
break;
case ID_Output_Table_JuniorsE:
OutTable(NULL, OutputDevice, TNFLAGSF_JUNIORE, TrnMode);
break;
case ID_Output_TableProgress:
OutTableProgress(NULL, OutputDevice, TrnMode);
break;
case ID_Output_DWZReport:
OutDWZReport(NULL, OutputDevice);
break;
case ID_Output_CrossTable_Ascii:
OutCrossTable(NULL, OutputDevice);
break;
case ID_Output_CrossTable_TeX:
OutCrossTable(NULL, DEVICE_FileTeX);
break;
case ID_Output_PlayerCards_Ascii:
OutPlayerCards(NULL, OutputDevice);
break;
case ID_Output_PlayerCards_TeX:
OutPlayerCards(NULL, DEVICE_FileTeX);
break;
case ID_Prefs_Scoring_Simple:
TrnMode &= ~TNMODE_TABMASK;
initMenu = TRUE;
break;
case ID_Prefs_Scoring_Buchholz:
TrnMode = (TrnMode & ~TNMODE_TABMASK) | TNMODEF_BUCHHOLZ;
initMenu = TRUE;
break;
case ID_Prefs_Scoring_ExtBuchholz:
TrnMode = (TrnMode & ~TNMODE_TABMASK) | TNMODEF_EXT_BUCHHOLZ;
initMenu = TRUE;
break;
case ID_Prefs_Scoring_SonnebornBerger:
TrnMode = (TrnMode & ~TNMODE_TABMASK) | TNMODEF_SONNEBORN_BERGER;
initMenu = TRUE;
break;
case ID_Prefs_Device_Screen:
OutputDevice = DEVICE_Screen;
initMenu = TRUE;
break;
case ID_Prefs_Device_PrinterDraft:
OutputDevice = DEVICE_PrinterDraft;
initMenu = TRUE;
break;
case ID_Prefs_Device_PrinterLQ:
OutputDevice = DEVICE_PrinterLQ;
initMenu = TRUE;
break;
case ID_Prefs_Device_File:
OutputDevice = DEVICE_FileAscii;
initMenu = TRUE;
break;
case ID_Prefs_SetGames:
GamesToBeSet = !GamesToBeSet;
initMenu = TRUE;
break;
case ID_Prefs_MakeIcons:
MakeIcons = !MakeIcons;
initMenu = TRUE;
break;
default:
if (UserData != NULL)
{ EnableARexx = TRUE;
SystemTags(UserData, SYS_UserShell, NULL, TAG_END);
}
initMenu = TRUE;
}
}
EnableARexx = TRUE;
/*
Let the window awake.
*/
get(MainWnd, MUIA_Window_Open, &open);
if (!NoWindow)
{ if (!open)
{ set(MainWnd, MUIA_Window_Open, TRUE);
}
if (initMenu)
{ MakeDisplay();
}
set(MainWnd, MUIA_Window_NoMenus, FALSE);
}
EnableARexx = TRUE;
/*
And put the application to sleep, waiting for user actions.
*/
if(Signal)
{ Wait(Signal);
}
}
}
#endif /* AMIGA */
/*
SetupPrefs() sets up the preferences in a way corresponding to a new
or loaded tournament.
*/
void SetupPrefs(void)
#ifdef AMIGA
{ switch (TrnMode &= TNMODE_TABMASK)
{ case TNMODEF_BUCHHOLZ:
DoMethod(MainWnd, MUIM_Window_SetMenuCheck, ID_Prefs_Scoring_Buchholz,
TRUE);
break;
case TNMODEF_EXT_BUCHHOLZ:
DoMethod(MainWnd, MUIM_Window_SetMenuCheck,
ID_Prefs_Scoring_ExtBuchholz, TRUE);
break;
case TNMODEF_SONNEBORN_BERGER:
DoMethod(MainWnd, MUIM_Window_SetMenuCheck,
ID_Prefs_Scoring_SonnebornBerger, TRUE);
break;
default:
DoMethod(MainWnd, MUIM_Window_SetMenuCheck, ID_Prefs_Scoring_Simple,
TRUE);
break;
}
}
#endif /* AMIGA */